package cn.blog.dao.front;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import cn.blog.dao.conn.DataManager;
import cn.blog.dao.conn.ParamSet;
import cn.blog.dao.conn.RowDatas;
import cn.blog.entity.origin.User;

/**
 * 用户dao层
 * 
 * @author 江明
 * @time 2018年3月14日
 * @function
 */
public class UserDao extends DataManager {

	private RowDatas<User> user;
	private RowDatas<String> oneRow;
	private RowDatas<Integer> userId;

	/**
	 * 无参构造 初始化
	 */
	public UserDao() {
		user = new UserData();
		oneRow = new oneRowData();
		userId = new userIdData();
	}

	/**
	 * 添加用户
	 * 
	 * @param userAccount
	 *            用户账号
	 * @param password
	 *            用户密码
	 * @param name
	 *            用户姓名
	 * @param image
	 *            用户头像
	 * @param sex
	 *            用户性别 0男 1女
	 * @param phone
	 *            用户电话
	 * @param qq
	 *            用户qq号
	 * @param email
	 *            用户邮箱
	 * @param userClass
	 *            用户类型 博主/管理员
	 * @param userRegTime
	 *            用户注册时间
	 * @param state
	 *            用户状态 0正常/1拉黑
	 * @return 修改的行数
	 */
	public int addUserInfo(String userAccount, String password, String name, String image, Integer sex, String phone,
			String qq, String email, String userClass, Date userRegTime, Integer state) {
		String sql = "insert into tb_user (user_account,user_password,user_name,user_image,"
				+ "user_sex,user_phone,user_qq,user_email,user_class,user_reg_time,user_state)"
				+ " values(?,?,?,?,?,?,?,?,?,?,?)";
		return updateExecuted(sql,
				new ParamSet(userAccount, password, name, image, sex, phone, qq, email, userClass, userRegTime, state));
	}

	/**
	 * 根据用户姓名更改用户状态
	 * 
	 * @param state
	 *            状态
	 * @param name
	 *            用户姓名
	 * @return 修改的行数
	 */
	public int updateUserState(String state, String name) {
		String sql = "update tb_user set user_state = ? where user_name = ? ";
		return updateExecuted(sql, new ParamSet(state, name));

	}

	/**
	 * 根据姓名修改用户其他信息
	 * 
	 * @param userAccount
	 *            用户账号
	 * @param password
	 *            用户密码
	 * @param image
	 *            用户头像
	 * @param sex
	 *            用户性别 0男 1女
	 * @param phone
	 *            用户电话
	 * @param qq
	 *            用户qq号
	 * @param email
	 *            用户邮箱
	 * @param userClass
	 *            用户类型 博主/用户
	 * @param userRegTime
	 *            用户注册时间
	 * @param state
	 *            用户状态 0正常/1拉黑
	 * @param name
	 *            用户姓名
	 * @return 修改的行数
	 */
	public int updateUserInf(String userAccount, String password, String image, Integer sex, String phone, String qq,
			String email, String userClass, Date userRegTime, Integer state, String name) {
		String sql = "update tb_user set user_account = ?, set user_password = ?, set user_name = ?, "
				+ "set user_image = ?, set user_sex = ?, set user_phone = ?, set user_qq = ?, set user_email = ?"
				+ ", set user_class = ?, set user_reg_time = ?, set user_state = ? where user_name = ?  ";
		return updateExecuted(sql,
				new ParamSet(userAccount, password, image, sex, phone, qq, email, userClass, userRegTime, state, name));

	}

	/**
	 * 查询所有用户的姓名
	 * 
	 * @return 用户名列表
	 */
	public List<String> getUserNameAll() {
		String sql = "select user_name from tb_user ";
		return queryList(sql, oneRow);
	}

	/**
	 * 根据名字查询用户密码
	 * 
	 * @param uname
	 *            用户名
	 * @return 密码
	 */
	public String getUserPassword(String uname) {
		String sql = "select user_password from tb_user where user_name = ?";
		return query(sql, new ParamSet(uname), oneRow);
	}

	/**
	 * 获取所有用户信息
	 * 
	 * @return
	 */
	public List<User> getUserAll() {
		String sql = "select * from tb_user";
		return queryList(sql, user);
	}

	/**
	 * 根据用户id获取所有用户信息
	 * 
	 * @return 用户对象
	 */
	public User getUser(int userId) {
		String sql = "select * from tb_user where user_id = ?";
		return query(sql, new ParamSet(userId), user);
	}

	/**
	 * 获取用户数据源
	 * 
	 * @author 江明
	 * @time 2018年3月14日
	 * @function
	 */
	private class UserData implements RowDatas<User> {

		@Override
		public User getRowData(ResultSet rs) throws SQLException {
			User user = new User();
			user.setUserId(rs.getInt(1));
			user.setUserAccount(rs.getString(2));
			user.setPassword(rs.getString(3));
			user.setName(rs.getString(4));
			user.setImage(rs.getString(5));
			user.setSex(rs.getInt(6));
			user.setPhone(rs.getString(7));
			user.setQq(rs.getString(8));
			user.setEmail(rs.getString(9));
			user.setUserClass(rs.getString(10));
			user.setUserRegTime(rs.getDate(11));
			user.setState(rs.getInt(12));

			return user;
		}

	}

	/**
	 * 
	 * @author 江明
	 * @time 2018年3月16日
	 * @function
	 */
	private class oneRowData implements RowDatas<String> {

		@Override
		public String getRowData(ResultSet rs) throws SQLException {

			return rs.getString(1);
		}

	}

	/**
	 * 根据用户名获取用户id
	 * 
	 * @param uname
	 *            用户名
	 * @return 用户id
	 */
	public int getuserId(String uname) {
		String sql = "SELECT user_id FROM tb_user WHERE user_name = ?";
		return query(sql, new ParamSet(uname), userId);
	}

	private class userIdData implements RowDatas<Integer> {

		@Override
		public Integer getRowData(ResultSet rs) throws SQLException {

			return rs.getInt(1);
		}

	}

	/**
	 * 根据用户名查询用户信息
	 * 
	 * @param uname
	 *            用户名
	 * @return 用户对象
	 */
	public User getUser(String uname) {
		String sql = "select * from tb_user where user_name = ?";
		return query(sql, new ParamSet(uname), user);
	}

	/**
	 * 根据用户编号更改用户昵称和性别
	 * 
	 * @param uname
	 *            用户昵称
	 * @param sex
	 *            性别
	 * @param uid
	 *            用户编号
	 * @return 成功行数
	 */
	public int update(String uname, int sex, int uid) {
		String sql = "UPDATE tb_user SET user_name = ?, user_sex = ? WHERE user_id = ?";
		return updateExecuted(sql, new ParamSet(uname, sex, uid));

	}

	/**
	 * 根据用户编号更改用户电话，QQ号，邮箱
	 * 
	 * @param phone
	 *            电话
	 * @param qqNum
	 *            QQ号
	 * @param email
	 *            邮箱
	 * @param uid
	 *            用户编号
	 * @return 成功行数
	 */
	public int update(String phone, String qqNum, String email, int uid) {
		String sql = "UPDATE tb_user SET user_phone = ?, user_qq = ?, user_email = ? WHERE user_id = ?";
		return updateExecuted(sql, new ParamSet(phone, qqNum, email, uid));

	}
	/**
	 * 根据用户编号更改用户头像
	 * @param touxiang	用户头像
	 * @param uid	用户编号
	 * @return
	 */
	public int update(String touxiang, int uid) {
		String sql = "UPDATE tb_user SET user_image = ? WHERE user_id = ?";
		return updateExecuted(sql, new ParamSet(touxiang, uid));
	}
	
	/**
	 * 根据用户编号更改用户密码
	 * @param password	用户密码
	 * @param uid	用户编号
	 * @return
	 */
	public int updatePass(String password, int uid) {
		String sql = "UPDATE tb_user SET user_password = ? WHERE user_id = ?";
		return updateExecuted(sql, new ParamSet(password, uid));
	}

}
